//n 张多米诺骨牌排成一行，将每张多米诺骨牌垂直竖立。在开始时，同时把一些多米诺骨牌向左或向右推。 
//
// 每过一秒，倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地，倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。 
//
// 如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时，由于受力平衡， 该骨牌仍然保持不变。 
//
// 就这个问题而言，我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。 
//
// 给你一个字符串 dominoes 表示这一行多米诺骨牌的初始状态，其中： 
//
// 
// dominoes[i] = 'L'，表示第 i 张多米诺骨牌被推向左侧， 
// dominoes[i] = 'R'，表示第 i 张多米诺骨牌被推向右侧， 
// dominoes[i] = '.'，表示没有推动第 i 张多米诺骨牌。 
// 
//
// 返回表示最终状态的字符串。 
//
// 示例 1： 
//
// 
//输入：dominoes = "RR.L"
//输出："RR.L"
//解释：第一张多米诺骨牌没有给第二张施加额外的力。
// 
//
// 示例 2： 
// 
// 
//输入：dominoes = ".L.R...LR..L.."
//输出："LL.RR.LLRRLL.."
// 
//
// 
//
// 提示： 
//
// 
// n == dominoes.length 
// 1 <= n <= 10⁵ 
// dominoes[i] 为 'L'、'R' 或 '.' 
// 
//
// Related Topics 双指针 字符串 动态规划 👍 357 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2025-05-02 22:08:09
 * @description 838.推多米诺
 */
public class PushDominoes{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 PushDominoes fun=new PushDominoes();
	 	 Solution solution = fun.new Solution();
		solution.pushDominoes(".L.R...LR..L..");
	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public String pushDominoes(String dominoes) {
		int n = dominoes.length();
		int[] forces = new int[n];

		// 从左向右计算R的影响
		int force = 0;
		for (int i = 0; i < n; i++) {
			if (dominoes.charAt(i) == 'R') {
				force = n;  // 最大影响力
			} else if (dominoes.charAt(i) == 'L') {
				force = 0;  // 重置
			} else {
				force = Math.max(force - 1, 0);
			}
			forces[i] += force;
		}

		// 从右向左计算L的影响
		force = 0;
		for (int i = n - 1; i >= 0; i--) {
			if (dominoes.charAt(i) == 'L') {
				force = n;
			} else if (dominoes.charAt(i) == 'R') {
				force = 0;
			} else {
				force = Math.max(force - 1, 0);
			}
			forces[i] -= force;
		}

		// 生成结果字符串
		StringBuilder result = new StringBuilder();
		for (int f : forces) {
			result.append(f > 0 ? 'R' : f < 0 ? 'L' : '.');
		}
		return result.toString();
	}
}
//leetcode submit region end(Prohibit modification and deletion)

}
